import { callApi } from "./base";
import {
  MIDEA_COMMON,
  OS,
  MIDEA_PDF,
  MIDEA_MAP,
  MIDEA_FILE_PREVIEW,
} from "@/config/constants";

/**
 * 隐藏系统键盘
 * @returns Promise
 */
function hideKeyboard(): Promise<any> {
  return callApi(MIDEA_COMMON, "hideInput", []);
}

/**
 * 更改Native端导航栏颜色
 * @param color rbga数组：[red, blue, green, alpha]
 */
function changeStatusBarColor(color: Array<number>): void {
  const os = OSCheck();
  if (os === OS.IOS) {
    callApi(MIDEA_COMMON, "statusBarColor", color);
  } else if (os === OS.Android) {
    callApi(MIDEA_COMMON, "statusBarColor4Android", color);
  }
}

/**
 * 浏览器环境操作系统判断
 * @returns 操作系统类型
 */
function OSCheck(): OS {
  const ua = window.navigator.userAgent;
  if (/(iPhone|iPad|iPod|iOS)/i.test(ua)) {
    return OS.IOS;
  } else if (/(Android)/i.test(ua)) {
    return OS.Android;
  }
  return OS.Other;
}

/**
 * 显示导航
 * @return {*|promise}
 */
function showNav(): void {
  callApi(MIDEA_COMMON, "showNav", null);
}

/**
 * 使用系统默认浏览器打开链接
 * @param url 需要使用系统浏览器打开的url
 */
function openSystemBrowser(url: string): void {
  callApi(MIDEA_COMMON, "openSysBrowser", [url]);
}

/**
 * 使用iChangan浏览器打开链接
 * @param url 需要使用iChangan浏览器打开的url
 */
function openBrowser(url: string): void {
  callApi(MIDEA_COMMON, "openUrl", [url]);
}

/**
 * 隐藏浮动按钮
 */
function hideFloatButton(): void {
  callApi(MIDEA_COMMON, "hideFloat", null);
}

/**
 * 调用客户端分享组件
 * shareObj字段如下
 * {
 *   title 分享标题
 *   subTitle 分享子标题
 *   action openH5 或 openUrl
 *   widgetId H5模块id
 *   widgetExtra 扩展参数
 *   url url地址
 *   imageUrl 图片地址
 *   actionType 1-分享
 *   shareRange 0-美信和其它都不分享 1-只分享到美信 2-分享到美信和其它 4-分享其他,不分享美信
 *   sharePageTitle 服务号希望ActionBar 一直显示服务号名称
 *   sid 服务号id
 * }
 * @param shareObj 分享对象
 * @returns Promise
 */
function showClientShare(shareObj: any): Promise<any> {
  return callApi(MIDEA_COMMON, "showShare", [shareObj]);
}

/**
 * 跳转其他轻应用模块
 * @param id 模块identifier
 * @param data 数据
 */
function jumpModule(id: string, data: any): void {
  callApi(MIDEA_COMMON, "showWidget", [id, JSON.stringify(data)]);
}

/**
 * 获取扩展字段
 * @param identifier 轻应用identifier
 * @returns Promise
 */
function getClientExtra(identifier: string): Promise<any> {
  return callApi(MIDEA_COMMON, "getExtra", [identifier]);
}

/**
 * 根据URL下载并打开PDF
 * @param url pdf文件所在url
 */
function openPDF(url: string): void {
  callApi(MIDEA_PDF, "showPdf", [url]);
}

function makeCall(phone: string): void {
  callApi(MIDEA_COMMON, "callPhone", [phone]);
}

/**
 * 设备旋转
 */
function deviceRotate(): void {
  callApi(MIDEA_COMMON, "orientation", []);
}

/**
 * 关掉iOS webview弹簧效果
 */
function disableIOSBounce(): Promise<any> | void {
  callApi(MIDEA_COMMON, "setBounces", [false]);
}

/**
 * 隐藏标题栏
 */
function hideNavBar(): Promise<any> | void {
  callApi(MIDEA_COMMON, "hideNav", []);
}

/**
 * 获取设备信息
 */
function getDevice(): Promise<any> | void {
  return callApi(MIDEA_COMMON, "getDeviceInfo", []);
}

/**
 * 持续定位
 * @param interval 间隔
 */
function startContinusLocate(interval: number): void {
  callApi(MIDEA_MAP, "startUpdatingLocation", [interval]);
}

/**
 * 结束持续定位
 */
function stopContinusLocate(): void {
  callApi(MIDEA_MAP, "stopUpdatingLocation", null);
}

/**
 * 获取定位
 */
function fetchLocate(): Promise<any> {
  return callApi(MIDEA_MAP, "location", ["1"]);
}

/**
 * 预览文件
 * @param fileObj 文件
 */
function previewFile(fileObj: any): Promise<any> | void {
  callApi(MIDEA_FILE_PREVIEW, "previewWithFiles", [fileObj]);
}

export {
  hideKeyboard,
  changeStatusBarColor,
  OSCheck,
  showNav,
  openSystemBrowser,
  openBrowser,
  hideFloatButton,
  showClientShare,
  jumpModule,
  getClientExtra,
  openPDF,
  makeCall,
  deviceRotate,
  disableIOSBounce,
  hideNavBar,
  getDevice,
  startContinusLocate,
  stopContinusLocate,
  fetchLocate,
  previewFile,
};
